module obs_err_mod

  use const_mod
  use missing_value_mod

  implicit none

  type obs_err_type
    real(r8) :: u = 0
    real(r8) :: v = 0
    real(r8) :: t = 0
    real(r8) :: q = 0
    real(r8) :: p = 0
  end type obs_err_type

  real(r8), parameter :: raob_err_plev(16) = [ &
    1000.0, 925.0, 850.0, 700.0, 500.0, 400.0, 300.0, 250.0, 200.0, 150.0, 100.0, 70.0, 50.0, 30.0, 20.0, 10.0 &
  ]
  real(r8), parameter :: raob_err_plev_bnds(2,16) = reshape([ &
    937.5,1100.0, &
    887.5, 937.5, &
    775.0, 887.5, &
    600.0, 775.0, &
    450.0, 600.0, &
    350.0, 450.0, &
    275.0, 350.0, &
    225.0, 275.0, &
    175.0, 225.0, &
    125.0, 175.0, &
     85.0, 125.0, &
     60.0,  85.0, &
     40.0,  60.0, &
     25.0,  40.0, &
     15.0,  25.0, &
      0.0,  15.0  &
  ], [2,16])
  real(r8), parameter :: p_err_raob(size(raob_err_plev)) = [ &
    0.9603, & ! 1000
    0.7504, & !  925
    0.6840, & !  850
    0.5669, & !  700
    0.5228, & !  500
    0.5356, & !  400
    0.4459, & !  300
    0.5419, & !  250
    0.4341, & !  200
    0.3813, & !  150
    0.2976, & !  100
    0.3312, & !   70
    0.2461, & !   50
    0.2151, & !   30
    0.1234, & !   20
    0.0617  & !   10
  ]
  real(r8), parameter :: t_err_raob(size(raob_err_plev)) = [ &
    1.7, & ! 1000
    1.5, & !  925
    1.5, & !  850
    1.3, & !  700
    1.2, & !  500
    1.2, & !  400
    1.4, & !  300
    1.5, & !  250
    1.5, & !  200
    1.6, & !  150
    1.7, & !  100
    1.8, & !   70
    1.9, & !   50
    2.0, & !   30
    2.2, & !   20
    2.5  & !   10
  ]
  real(r8), parameter :: u_err_raob(size(raob_err_plev)) = [ &
    2.3, & ! 1000
    2.3, & !  925
    2.3, & !  850
    2.5, & !  700
    3.0, & !  500
    3.5, & !  400
    3.7, & !  300
    3.5, & !  250
    3.5, & !  200
    3.4, & !  150
    3.3, & !  100
    3.2, & !   70
    3.2, & !   50
    3.6, & !   30
    3.6, & !   20
    4.5  & !   10
  ]
  real(r8), parameter :: v_err_raob(size(raob_err_plev)) = [ &
    2.3, & ! 1000
    2.3, & !  925
    2.3, & !  850
    2.5, & !  700
    3.0, & !  500
    3.5, & !  400
    3.7, & !  300
    3.5, & !  250
    3.5, & !  200
    3.4, & !  150
    3.3, & !  100
    3.2, & !   70
    3.2, & !   50
    3.6, & !   30
    3.6, & !   20
    4.5  & !   10
  ]
  real(r8), parameter :: q_err_raob(size(raob_err_plev)) = [ &
    0.27459E-02, & ! 1000
    0.22469E-02, & !  925
    0.17818E-02, & !  850
    0.11234E-02, & !  700
    0.45770E-03, & !  500
    0.22340E-03, & !  400
    0.70032E-04, & !  300
    0.28560E-04, & !  250
    0.10234E-04, & !  200
    0.43425E-05, & !  150
    0.31649E-05, & !  100
    0.44175E-05, & !   70
    0.66314E-05, & !   50
    0.54175E-05, & !   30
    0.54175E-05, & !   20
    0.54175E-05  & !   10
  ]

  real(r8), parameter :: synop_err_plev(15) = [ &
    1000.0, 850.0, 700.0, 500.0, 400.0, 300.0, 250.0, 200.0, 150.0, 100.0, 70.0, 50.0, 30.0, 20.0, 10.0 &
  ]
  real(r8), parameter :: synop_err_plev_bnds(2,15) = reshape([ &
    937.5, 1200.0, &
    775.0,  937.0, &
    600.0,  775.0, &
    450.0,  600.0, &
    350.0,  450.0, &
    275.0,  350.0, &
    225.0,  275.0, &
    175.0,  225.0, &
    125.0,  175.0, &
     85.0,  125.0, &
     60.0,   85.0, &
     40.0,   60.0, &
     25.0,   40.0, &
     15.0,   25.0, &
      0.0,   15.0  &
  ], [2,15])
  real(r8), parameter :: p_err_synop(size(synop_err_plev)) = [ &
    0.7994, & ! 1000
    0.7975, & !  850
    0.7301, & !  700
    0.7766, & !  500
    0.7968, & !  400
    0.7997, & !  300
    0.9342, & !  250
    0.8498, & !  200
    0.7796, & !  150
    0.6595, & !  100
    0.5840, & !   70
    0.4766, & !   50
    0.3247, & !   30
    0.2938, & !   20
    0.1722  & !   10
  ]
  real(r8), parameter :: t_err_synop(size(synop_err_plev)) = [ &
    2.0, & ! 1000
    1.5, & !  850
    1.3, & !  700
    1.2, & !  500
    1.3, & !  400
    1.5, & !  300
    1.8, & !  250
    1.8, & !  200
    1.9, & !  150
    2.0, & !  100
    2.2, & !   70
    2.4, & !   50
    2.5, & !   30
    2.5, & !   20
    2.5  & !   10
  ]
  real(r8), parameter :: u_err_synop(size(synop_err_plev)) = [ &
    3.0, & ! 1000
    3.0, & !  850
    3.0, & !  700
    3.4, & !  500
    3.6, & !  400
    3.8, & !  300
    3.8, & !  250
    3.2, & !  200
    2.4, & !  150
    2.2, & !  100
    2.0, & !   70
    2.0, & !   50
    2.0, & !   30
    2.5, & !   20
    3.0  & !   10
  ]
  real(r8), parameter :: v_err_synop(size(synop_err_plev)) = [ &
    3.0, & ! 1000
    3.0, & !  850
    3.0, & !  700
    3.4, & !  500
    3.6, & !  400
    3.8, & !  300
    3.8, & !  250
    3.2, & !  200
    2.4, & !  150
    2.2, & !  100
    2.0, & !   70
    2.0, & !   50
    2.0, & !   30
    2.5, & !   20
    3.0  & !   10
  ]
  real(r8), parameter :: q_err_synop(size(synop_err_plev)) = [ &
    2.58E-05,           & ! 1000
    3.07E-05,           & !  850
    2.50E-03,           & !  700
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value, &
    real_missing_value  &
  ]

  real(r8), parameter :: amdar_err_plev(15) = [ &
    1000.0, 850.0, 700.0, 500.0, 400.0, 300.0, 250.0, 200.0, 150.0, 100.0, 70.0, 50.0, 30.0, 20.0, 10.0 &
  ]
  real(r8), parameter :: amdar_err_plev_bnds(2,15) = reshape([ &
    937.5,1200.0, &
    775.0, 937.0, &
    600.0, 775.0, &
    450.0, 600.0, &
    350.0, 450.0, &
    275.0, 350.0, &
    225.0, 275.0, &
    175.0, 225.0, &
    125.0, 175.0, &
     85.0, 125.0, &
     60.0,  85.0, &
     40.0,  60.0, &
     25.0,  40.0, &
     15.0,  25.0, &
      0.0,  15.0  &
  ], [2,15])
  real(r8), parameter :: p_err_amdar(size(amdar_err_plev)) = [ &
    0.7994, & ! 1000
    0.9104, & !  850
    0.7975, & !  700
    0.7301, & !  500
    0.7766, & !  400
    0.7968, & !  300
    0.7997, & !  250
    0.9342, & !  200
    0.8498, & !  150
    0.7796, & !  100
    0.6595, & !   70
    0.5840, & !   50
    0.4766, & !   30
    0.3247, & !   20
    0.2938  & !   10
  ]
  real(r8), parameter :: t_err_amdar(size(amdar_err_plev)) = [ &
    1.4, & ! 1000
    1.3, & !  850
    1.2, & !  700
    1.2, & !  500
    1.2, & !  400
    1.3, & !  300
    1.3, & !  250
    1.4, & !  200
    1.4, & !  150
    1.4, & !  100
    1.5, & !   70
    1.6, & !   50
    1.8, & !   30
    2.0, & !   20
    2.2  & !   10
  ]
  real(r8), parameter :: u_err_amdar(size(amdar_err_plev)) = [ &
    2.5, & ! 1000
    2.5, & !  850
    3.0, & !  700
    3.0, & !  500
    4.0, & !  400
    4.0, & !  300
    4.0, & !  250
    4.0, & !  200
    4.0, & !  150
    4.0, & !  100
    4.0, & !   70
    4.0, & !   50
    4.0, & !   30
    4.0, & !   20
    4.0  & !   10
  ]
  real(r8), parameter :: v_err_amdar(size(amdar_err_plev)) = [ &
    2.5, & ! 1000
    2.5, & !  850
    3.0, & !  700
    3.0, & !  500
    4.0, & !  400
    4.0, & !  300
    4.0, & !  250
    4.0, & !  200
    4.0, & !  150
    4.0, & !  100
    4.0, & !   70
    4.0, & !   50
    4.0, & !   30
    4.0, & !   20
    4.0  & !   10
  ]
  real(r8), parameter :: q_err_amdar(size(amdar_err_plev)) = [ &
    0.27459E-02, & ! 1000
    0.17818E-02, & !  850
    0.11234E-02, & !  700
    0.45770E-03, & !  500
    0.22340E-03, & !  400
    0.70032E-04, & !  300
    0.28560E-04, & !  250
    0.10234E-04, & !  200
    0.43425E-05, & !  150
    0.31649E-05, & !  100
    0.44175E-05, & !   70
    0.66314E-05, & !   50
    0.54175E-05, & !   30
    0.54175E-05, & !   20
    0.54175E-05  & !   10
  ]

  real(r8), parameter :: profiler_err_plev(15) = [                                                       &
    1000.0, 925.0, 850.0, 700.0, 500.0, 400.0, 300.0, 250.0, 200.0, 150.0, 100.0, 70.0, 50.0, 30.0, 20.0 &
  ]
  real(r8), parameter :: profiler_err_plev_bnds(2,size(profiler_err_plev)) = reshape([ &
    962.5, 1100.0, & ! 1000
    887.5,  962.5, & !  925
    775.0,  887.5, & !  850
    600.0,  775.0, & !  700
    450.0,  600.0, & !  500
    350.0,  450.0, & !  400
    275.0,  350.0, & !  300
    225.0,  275.0, & !  250
    175.0,  225.0, & !  200
    125.0,  175.0, & !  150
     85.0,  125.0, & !  100
     60.0,   85.0, & !   70
     40.0,   60.0, & !   50
     25.0,   40.0, & !   30
      0.0,   25.0  & !   20
  ], [2,size(profiler_err_plev)])
  real(r8), parameter :: u_err_profiler(size(profiler_err_plev)) = [ &
    1.4, & ! 1000
    1.5, & !  925
    1.6, & !  850
    1.8, & !  700
    1.9, & !  500
    2.0, & !  400
    2.1, & !  300
    2.3, & !  250
    2.6, & !  200
    2.8, & !  150
    3.0, & !  100
    3.2, & !   70
    2.7, & !   50
    2.4, & !   30
    2.1  & !   20
  ]
  real(r8), parameter :: v_err_profiler(size(profiler_err_plev)) = [ &
    1.4, & ! 1000
    1.5, & !  925
    1.6, & !  850
    1.8, & !  700
    1.9, & !  500
    2.0, & !  400
    2.1, & !  300
    2.3, & !  250
    2.6, & !  200
    2.8, & !  150
    3.0, & !  100
    3.2, & !   70
    2.7, & !   50
    2.4, & !   30
    2.1  & !   20
  ]

end module obs_err_mod
